package com.devshephard.jucks.VolatileDemo;


import java.util.concurrent.atomic.AtomicInteger;

/**
 * Volatile不保证原子性测试
 */
public class VolatileUnAtomic {

    //public volatile static Integer num = 0;  //Volatile不保证原子性操作
    public volatile static AtomicInteger atomicInteger = new AtomicInteger();  //可以使用AtomicInteger这个类进行原子性操作


    public  static void add(){
        //num++; //num++的操作不是原子性的，如果要使num++为原子性操作，则需要在方法上标注为syncorized关键字。
        atomicInteger.getAndIncrement();  //Atomic类中的getAndIncrement()方法实际上就是 +1 操作，但是是原子性的
    }

    public static void main(String[] args) {

        for (int i = 1; i <= 20; i++) {
            new Thread(()->{
                for (int j = 1; j <= 1000; j++) {  //创建线程进行num的加法，最终的结果应该是20000
                    add();
                }
            }).start();
        }

        while (Thread.activeCount() > 2){ //由于java中的main和gc这两个线程一直都是存在的，为了保证上面创建的子线程执行完毕再执行下去，则当前线程数量大于2时，线程礼让给子线程执行。
            Thread.yield(); //礼让给子线程执行
        }

        System.out.println(Thread.currentThread().getName() + " " + atomicInteger); //输出结果
    }
}
